#include <graphics.h>  // 引用 EasyX 图形库
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926

// 引用 Windows Multimedia API
#pragma comment(lib,"Winmm.lib")
// 游戏画面尺寸
#define Width 825
#define High 600

IMAGE img_bk[6];//定义背景图片
IMAGE img_gameover;//定义背景图片
IMAGE img_m_car;//定义主汽车图片
IMAGE img_enemy[8];//定义敌人汽车图片
IMAGE img_boss[4];//定义boss汽车图片
IMAGE img_fuel1;//定义油表图片
IMAGE img_fuel2;//定义油表遮罩图片
IMAGE img_fuel;//定义加油图片
IMAGE img_heart;//定义爱心图片

float background_x[6],background_y[6];//背景图片坐标
float fuel_x,fuel_y;//加油站坐标
float main_car_x,main_car_y; // 主汽车坐标 
float Temp_x,Temp_y; //主汽车暂存坐标
float enemy_x[8],enemy_y[8];//敌人坐标
float enemy_temp_x[8],enemy_temp_y[8];//敌人暂时坐标
float boss_x[4],boss_y[4];//boss坐标
float boss_temp_x[4];//boss暂时坐标

char f='0';//移动方向
int choice=0;//难度选择
int score=0;
char score_char[5]={0};//得分情况
int step=1;//关卡选择
int step_choice;
char step_char[5]={0};//关卡情况
float fuel=101;
char fuel_char[10]={0};//油量情况
int heart_num=3;

int pointerlength=70;
int pointer_x, pointer_y;
float pointer_angle=0;
// 游戏状态，0为初始菜单界面，1为正常游戏，2为结束游戏状态，3为游戏暂停，4为游戏结束，5为通关
int gameStatus = 0; 
float V_bk=0.5,V_car=0.2;//背景和汽车下落速度
float score_y=-80;//得分文字坐标
float Fuel_y=-80;//油量文字坐标
float heart_y=-80;//生命文字坐标

void readRecordFile();  //读取游戏数据文件存档
void writeRecordFile();  //存储游戏数据文件存档
void background_fall();//背景下落
void winMenu(); // 游戏通关界面

void startMenu() // 初始菜单界面
{
	//输出image对象
	putimage(background_x[0], background_y[0], &img_bk[0]);
	putimage(background_x[1], background_y[1], &img_bk[1]);
	putimage(background_x[2], background_y[2], &img_bk[2]);
	putimage(background_x[3], background_y[3], &img_bk[3]);
	putimage(background_x[4], background_y[4], &img_bk[4]);
	putimage(background_x[5], background_y[5], &img_bk[5]);
	background_fall();
	
	if(choice==0)
	{
		setbkmode(TRANSPARENT);
		settextcolor(YELLOW);
		settextstyle(80,0, _T("黑体"));
		outtextxy(Width*0.3, High*0.1, "极速狂飙");
		settextcolor(YELLOW);
		settextstyle(65,0, _T("黑体"));
		outtextxy(Width*0.3, High*0.30, "1 新游戏");
		outtextxy(Width*0.3, High*0.45, "2 读取游戏存档");
		outtextxy(Width*0.3, High*0.60, "3 退出");
		settextstyle(30,0, _T("黑体"));
		outtextxy(Width*0.30, High*0.75, "按对应数字键进行游戏");
		outtextxy(Width*0.30, High*0.80, "撞到小车加5分,得分到200通关");
		outtextxy(Width*0.30, High*0.85, "撞到大车减1条命,共有3条命");



		FlushBatchDraw();
		
		char input;
		if(kbhit())  // 判断是否有输入
		{
			input = getch();  // 根据用户的不同输入来移动，不必输入回车
			if (input == '1') 
				choice = 1;
			else if (input == '2')
			{
				readRecordFile();
				gameStatus = 1;
			}
			else if (input == '3')
			{
				gameStatus = 2;
				exit(0);
			}
		}
	}
	if (choice==1)
	{
		setbkmode(TRANSPARENT);
		settextcolor(YELLOW);
		settextstyle(65,0, _T("黑体"));
		outtextxy(Width*0.3, High*0.2, "1 简单");
		outtextxy(Width*0.3, High*0.35, "2 一般");
		outtextxy(Width*0.3, High*0.5, "3 困难");
		FlushBatchDraw();
		
		char input;
		if(kbhit())  // 判断是否有输入
		{
			input = getch();  // 根据用户的不同输入来移动，不必输入回车
			if (input == '1')
			{
				step_choice=1;
				V_bk=0.7;
				V_car=0.2;
				gameStatus = 1;
			}
			else if (input == '2')
			{
				step_choice=2;
				V_bk=0.7;
				V_car=0.4;
				gameStatus = 1;
			}
			else if (input == '3')
			{
				step_choice=3;
				V_bk=0.7;
				V_car=0.6;
				gameStatus = 1;
			}
		}
	}
}

void pauseMenu() // 游戏暂停后菜单界面，一般按ESC键后启动该界面
{
	putimage(0, 0, &img_bk[0]);	// 显示背景
	setbkmode(TRANSPARENT);
	settextcolor(YELLOW);
	settextstyle(65,0, _T("黑体"));
	outtextxy(Width*0.3, High*0.2, "1 继续游戏");
	outtextxy(Width*0.3, High*0.35, "2 保存档案");
	outtextxy(Width*0.3, High*0.5, "3 退出");	
	FlushBatchDraw();
		
	char input;
	if(kbhit())  // 判断是否有输入
	{
		input = getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == '1') 
			gameStatus = 1;
		else if (input == '2')
		{
			writeRecordFile();
		}
		else if (input == '3')
		{
			gameStatus = 2;
			exit(0);
		}
	}
}

void winMenu() // 游戏通关界面
{
	putimage(0, 0, &img_bk[0]);	// 显示背景
	setbkmode(TRANSPARENT);
	settextcolor(YELLOW);
	settextstyle(80,0, _T("黑体"));
	outtextxy(Width*0.3-40, High*0.1, "恭喜通关!");
	setbkmode(TRANSPARENT);
	settextcolor(YELLOW);
	settextstyle(65,0, _T("黑体"));
	outtextxy(Width*0.3, High*0.35, "1 下一关");
	outtextxy(Width*0.3, High*0.50, "2 退出");		
	FlushBatchDraw();
		
	char input;
	if(kbhit())  // 判断是否有输入
	{
		input = getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == '1')
		{
			step++;
            V_bk=V_bk+0.15;
			V_car=V_car+0.15;
			gameStatus = 1;						
		}
		else if (input == '2')
		{
			gameStatus = 2;
			exit(0);
		}
	}
}

void overMenu() // 撞到大车启动
{
	putimage(0, 0, &img_gameover);//输出image对象
	setbkmode(TRANSPARENT);
	settextcolor(YELLOW);
	settextstyle(80,0, _T("黑体"));
	outtextxy(Width*0.3-80, High*0.1, "Game OverT＿T");
	setbkmode(TRANSPARENT);
	settextcolor(YELLOW);
	settextstyle(65,0, _T("黑体"));
	outtextxy(Width*0.3, High*0.35, "1 重新开始");
	outtextxy(Width*0.3, High*0.50, "2 保存档案");
	outtextxy(Width*0.3, High*0.65, "3 退出");	
	FlushBatchDraw();
	
	char input;
	if(kbhit())  // 判断是否有输入
	{
		input = getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == '1') 
		{
			mciSendString("open .\\gaming.mp3 alias gameMusic",NULL,0,NULL);//读取背景音乐
			mciSendString("play gameMusic repeat",NULL,0,NULL);
			main_car_x=Width/2-25; // 主汽车坐标 
			main_car_y=450;
			Temp_x=main_car_x; //主汽车暂存坐标
			Temp_y=main_car_y;
			
			enemy_x[0]=Width/2-20;//敌人初始坐标
			enemy_y[0]=100;
			enemy_x[1]=Width/2-127;//敌人初始坐标
			enemy_y[1]=50;
			enemy_x[2]=Width/2+85;//敌人初始坐标
			enemy_y[2]=-400;
			enemy_x[3]=Width/2-235;//敌人初始坐标
			enemy_y[3]=-600;
			enemy_x[4]=Width/2-20;//敌人初始坐标
			enemy_y[4]=-200;
			enemy_x[5]=Width/2-127;//敌人初始坐标
			enemy_y[5]=0;
			enemy_x[6]=Width/2+85;//敌人初始坐标
			enemy_y[6]=-150;
			enemy_x[7]=Width/2-235;//敌人初始坐标
			enemy_y[7]=-300;
			
			boss_x[0]=275;//boss初始坐标
			boss_y[0]=250;
			boss_x[1]=590;
			boss_y[1]=0;
			boss_x[2]=275;//boss初始坐标
			boss_y[2]=0;
			
			if(step_choice==1)
			{
				V_bk=0.7;
				V_car=0.2;
			}
			if(step_choice==2)
			{
				V_bk=0.7;
				V_car=0.4;
			}
			if(step_choice==3)
			{
				V_bk=0.7;
				V_car=0.6;
			}
			score=0;
			step=1;
			fuel=101;
			fuel_x=500;
			fuel_y=0;
			heart_num=3;
			gameStatus=1;
		}
		else if (input == '2')
		{
			writeRecordFile();
		}
		else if (input == '3')
		{
			gameStatus = 2;
			exit(0);
		}
	}
}

void score_screen() // 显示分数
{
	itoa(score,score_char,10);
	settextcolor(YELLOW);
	settextstyle(25,0,_T("宋体"));
	outtextxy(0,0,"得分:");
	outtextxy(65,0,score_char);
	if(score%200==0 && score>0)
	{
		gameStatus=5;
		score=0;
		fuel=101;
		heart_num=3;
	}
}

void fuel_screen() // 油量分数
{
	itoa(fuel,fuel_char,10);
	settextcolor(WHITE);
	settextstyle(25,0,_T("宋体"));
	outtextxy(0,27,"油量:");
	outtextxy(65,27,fuel_char);
}

void step_screen() // 显示关卡
{
	itoa(step,step_char,10);
	settextcolor(YELLOW);
	settextstyle(25,0,_T("宋体"));
	outtextxy(0,50,"关卡:");
	outtextxy(65,50,step_char);
	if(score%300==0 && score>0)
	{
		gameStatus=5;
		score=0;
		fuel=101;
		heart_num=3;
	}
}

void score_position() // 分数+5
{
	settextcolor(YELLOW);
	settextstyle(45,0,_T("黑体"));
	outtextxy(Width*0.5-100,score_y,"得分+5");
}

void fuel_position() // 油量+2
{
	settextcolor(GREEN);
	settextstyle(45,0,_T("黑体"));
	outtextxy(Width*0.5-100,Fuel_y,"油量+2");
}

void heart_position() // 生命-1
{
	settextcolor(RED);
	settextstyle(45,0,_T("黑体"));
	outtextxy(Width*0.5-100,heart_y,"生命-1");
}

void fuel_gauge()// 显示油表
{
	pointer_angle=fuel*PI/200-PI/2;//实现指针和油量的挂钩
	pointer_x=Width-20+pointerlength*sin(pointer_angle);
	pointer_y=High-20-pointerlength*cos(pointer_angle);
	setlinestyle(PS_SOLID,2);
	setcolor(RED);
	line(Width-20,High-20,pointer_x,pointer_y);
}

void readRecordFile()  //读取游戏数据文件存档
{ 
	FILE *fp;
	fp = fopen(".\\gameRecord.dat","r");
	fscanf(fp,"%d %f %d %f %f",&score,&fuel,&heart_num,&V_bk,&V_car);
	fclose(fp);
}

void writeRecordFile()  //存储游戏数据文件存档
{
	FILE *fp;
	fp = fopen(".\\gameRecord.dat","w");
	fprintf(fp,"%d %f %d %f %f",score,fuel,heart_num,V_bk,V_car);
	fclose(fp);
}

void startup()// 数据初始化
{
	mciSendString("open .\\open.mp3 alias openMusic",NULL,0,NULL);//读取背景音乐
	mciSendString("play openMusic repeat",NULL,0,NULL);
	
	initgraph(Width, High);//定义游戏画布
	
	HWND hwnd = GetHWnd();// 获取窗口句柄	
	SetWindowText(hwnd, "极速狂飙 v1.0");// 设置窗口标题文字
	
	loadimage(&img_bk[0],".\\background1.jpg");//读取背景图片位置
	loadimage(&img_bk[1],".\\background2.jpg");//读取背景图片位置
	loadimage(&img_bk[2],".\\background3.jpg");//读取背景图片位置
	loadimage(&img_bk[3],".\\background4.jpg");//读取背景图片位置
	loadimage(&img_bk[4],".\\background5.jpg");//读取背景图片位置
	loadimage(&img_bk[5],".\\background6.jpg");//读取背景图片位置
	loadimage(&img_gameover,".\\gameover.jpg");//读取背景图片位置
	loadimage(&img_m_car,".\\main_car.jpg");//读取主角汽车图片位置	
	loadimage(&img_enemy[0],".\\enemy1.jpg");//读取敌人图片黑色
	loadimage(&img_enemy[1],".\\enemy2.jpg");//读取敌人图片黄色
	loadimage(&img_enemy[2],".\\enemy3.jpg");//读取敌人图片白色
	loadimage(&img_enemy[3],".\\enemy4.jpg");//读取敌人图片绿色	
	loadimage(&img_boss[0],".\\boss1.jpg");//读取boss1图片
	loadimage(&img_boss[1],".\\boss2.jpg");//读取boss2图片	
	loadimage(&img_fuel1,".\\fuel_gauge1.jpg");//读取油表图片
	loadimage(&img_fuel2,".\\fuel_gauge2.jpg");//读取油表遮罩图片	
	loadimage(&img_fuel,".\\fuel.jpg");//读取加油图片	
	loadimage(&img_heart,".\\heart.jpg");//读取爱心图片
	
	background_x[0]=0;//背景初始坐标
	background_y[0]=0;
	background_x[1]=0;
	background_y[1]=-600;
	background_x[2]=0;
	background_y[2]=-1200;
	background_x[3]=0;
	background_y[3]=-1800;
	background_x[4]=0;
	background_y[4]=-2400;
	background_x[5]=0;
	background_y[5]=-3000;
	
	main_car_x=Width/2-25; // 主汽车坐标 
	main_car_y=450;
	Temp_x=main_car_x; //主汽车暂存坐标
	Temp_y=main_car_y;
	
	enemy_x[0]=Width/2-20;//敌人初始坐标
	enemy_y[0]=100;
	enemy_x[1]=Width/2-127;//敌人初始坐标
	enemy_y[1]=50;
	enemy_x[2]=Width/2+85;//敌人初始坐标
	enemy_y[2]=-400;
	enemy_x[3]=Width/2-235;//敌人初始坐标
	enemy_y[3]=-600;
	enemy_x[4]=Width/2-20;//敌人初始坐标
	enemy_y[4]=-200;
	enemy_x[5]=Width/2-127;//敌人初始坐标
	enemy_y[5]=0;
	enemy_x[6]=Width/2+85;//敌人初始坐标
	enemy_y[6]=-150;
	enemy_x[7]=Width/2-235;//敌人初始坐标
	enemy_y[7]=-300;
	
	boss_x[0]=275;//boss初始坐标
	boss_y[0]=250;
	boss_x[1]=590;
	boss_y[1]=0;
	boss_x[2]=275;//boss初始坐标
	boss_y[2]=0;
	
	fuel_x=500;
	fuel_y=0;	
	BeginBatchDraw();	
	
	while (gameStatus==0)
		startMenu(); // 初始菜单界面
	if(gameStatus==1)
	{
		mciSendString("close openMusic",NULL,0,NULL);
		mciSendString("open .\\gaming.mp3 alias gameMusic",NULL,0,NULL);//读取背景音乐
		mciSendString("play gameMusic repeat",NULL,0,NULL);
	}
}

void show()
{
	while (gameStatus==3)
		pauseMenu(); // 游戏暂停后菜单界面，一般按ESC键后启动该界面
	while (gameStatus==4)
		overMenu();
	while (gameStatus==5)
		winMenu();
	
	putimage(background_x[0], background_y[0], &img_bk[0]);//输出image对象
	putimage(background_x[1], background_y[1], &img_bk[1]);
	putimage(background_x[2], background_y[2], &img_bk[2]);
	putimage(background_x[3], background_y[3], &img_bk[3]);
	putimage(background_x[4], background_y[4], &img_bk[4]);
	putimage(background_x[5], background_y[5], &img_bk[5]);	
	putimage(fuel_x, fuel_y, &img_fuel);//在合适位置产生加油	
	putimage(enemy_x[0], enemy_y[0], &img_enemy[0]);//在合适位置产生敌人
	putimage(enemy_x[1], enemy_y[1], &img_enemy[1]);//在合适位置产生敌人
	putimage(enemy_x[2], enemy_y[2], &img_enemy[2]);//在合适位置产生敌人
	putimage(enemy_x[3], enemy_y[3], &img_enemy[3]);//在合适位置产生敌人
	putimage(enemy_x[4], enemy_y[4], &img_enemy[0]);//在合适位置产生敌人
	putimage(enemy_x[5], enemy_y[5], &img_enemy[1]);//在合适位置产生敌人
	putimage(enemy_x[6], enemy_y[6], &img_enemy[2]);//在合适位置产生敌人
	putimage(enemy_x[7], enemy_y[7], &img_enemy[3]);//在合适位置产生敌人	
	putimage(boss_x[0], boss_y[0], &img_boss[0]);//在合适位置产生boss1
	putimage(boss_x[1], boss_y[1], &img_boss[1]);//在合适位置产生boss2
	putimage(boss_x[2], boss_y[2], &img_boss[0]);//在合适位置产生boss3
	putimage(Temp_x, Temp_y, &img_m_car); // 在合适位置产生主角汽车
	
	if(heart_num==3)
	{
		putimage(0, 75, &img_heart);//在合适位置产生爱心1
		putimage(30, 75, &img_heart);//在合适位置产生爱心2
		putimage(60, 75, &img_heart);//在合适位置产生爱心3
	}	
	if(heart_num==2)
	{
		putimage(0, 75, &img_heart);//在合适位置产生爱心1
		putimage(30, 75, &img_heart);//在合适位置产生爱心2
	}	
	if(heart_num==1)
	{
		putimage(0, 75, &img_heart);//在合适位置产生爱心1
	}	
	setlinecolor(BLUE);
	circle(830,600,100);
	setlinecolor(WHITE);
	circle(830,600,90);
	fuel_screen();	
	score_screen();
	step_screen(); // 显示关卡	
	score_position(); // 分数+5
	fuel_position(); // 油量+2
	heart_position(); // 生命-1
	fuel_gauge();	
	FlushBatchDraw();
}

void background_fall()            //背景下落函数
{
	if(background_y[0]<High)
		background_y[0]+=V_bk;        
	else
		background_y[0]=-5*High;	
	if(background_y[1]<High)
		background_y[1]+=V_bk;        	
	else
		background_y[1]=-5*High;	
	if(background_y[2]<High)
		background_y[2]+=V_bk;        
	else
		background_y[2]=-5*High;	
	if(background_y[3]<High)
		background_y[3]+=V_bk;        	
	else
		background_y[3]=-5*High;	
	if(background_y[4]<High)
		background_y[4]+=V_bk;        
	else
		background_y[4]=-5*High;	
	if(background_y[5]<High)
		background_y[5]+=V_bk;        	
	else
		background_y[5]=-5*High;
}

void fuel_fall()					//加油站下落函数
{
	if(fuel_y<High)
		fuel_y+=V_bk;
	else
	{
		fuel_x=170+107*(rand()%5);//加油站产生在五条路中的一条
		fuel_y=-600;
	}
}

void enemy_fall()
{
	if(enemy_y[0]<High)
		enemy_y[0]+=V_car;		//敌人自动下落
	else
	{
		enemy_x[0]=170+107*(rand()%(5));//敌人产生在五条路中的一条
		enemy_y[0]=0;
	}	
	if(enemy_y[1]<High)
		enemy_y[1]+=V_car;		//敌人自动下落
	else
	{
		enemy_x[1]=170+107*(rand()%(5));//敌人产生在五条路中的一条
		enemy_y[1]=0;
	}	
	if(enemy_y[2]<High)
		enemy_y[2]+=V_car;		//敌人自动下落
	else
	{
		enemy_x[2]=170+107*(rand()%(5));//敌人产生在五条路中的一条
		enemy_y[2]=0;
	}	
	if(enemy_y[3]<High)
		enemy_y[3]+=V_car;		//敌人自动下落
	else
	{
		enemy_x[3]=170+107*(rand()%(5));//敌人产生在五条路中的一条
		enemy_y[3]=0;
	}	
	if(enemy_y[4]<High)
		enemy_y[4]+=V_car;		//敌人自动下落
	else
	{
		enemy_x[4]=170+107*(rand()%(5));//敌人产生在五条路中的一条
		enemy_y[4]=0;
	}	
	if(enemy_y[5]<High)
		enemy_y[5]+=V_car;		//敌人自动下落
	else
	{
		enemy_x[5]=170+107*(rand()%(5));//敌人产生在五条路中的一条
		enemy_y[5]=0;
	}	
	if(enemy_y[6]<High)
		enemy_y[6]+=V_car;		//敌人自动下落
	else
	{
		enemy_x[6]=170+107*(rand()%(5));//敌人产生在五条路中的一条
		enemy_y[6]=0;
	}	
	if(enemy_y[7]<High)
		enemy_y[7]+=V_car;		//敌人自动下落
	else
	{
		enemy_x[7]=170+107*(rand()%(5));//敌人产生在五条路中的一条
		enemy_y[7]=0;
	}	
}
void boss_fall()
{
	if(boss_y[0]<High)
		boss_y[0]+=V_car;        //boss1自动下落
	else
	{
		boss_x[0]=170+107*(rand()%5);//boss1产生在五条路中的一条
		boss_y[0]=-300;
	}	
	if(boss_y[1]<=High)
		boss_y[1]+=V_car;        //boss2自动下落
	else
	{
		boss_x[1]=170+107*(rand()%5);//boss1产生在五条路中的一条
		boss_y[1]=-300;
	}	
	if(boss_y[2]<=High)
		boss_y[2]+=V_car;        //boss2自动下落
	else
	{
		boss_x[2]=170+107*(rand()%5);//boss1产生在五条路中的一条
		boss_y[2]=-300;
	}	
}	

void enemy_hit_judgement()
{
	if(abs(enemy_y[0]-main_car_y) <100 && abs(enemy_x[0]-main_car_x) <10)//撞中敌人
	{	
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-100*(0+1);//减小敌人产生的重叠可能
		
		score=score+5;
		score_y=High*0.07;

		mciSendString("close scoremusic",NULL,0,NULL);
		mciSendString("open .\\score.mp3 alias scoremusic",NULL,0,NULL);//触发score音乐
		mciSendString("play scoremusic",NULL,0,NULL);
	}
	
	if(abs(enemy_y[1]-main_car_y) <100 && abs(enemy_x[1]-main_car_x) <10)//撞中敌人
	{	
		enemy_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[1]=-100*(1+1);//减小敌人产生的重叠可能
		
		score=score+5;
		score_y=High*0.07;
		
		mciSendString("close scoremusic",NULL,0,NULL);
		mciSendString("open .\\score.mp3 alias scoremusic",NULL,0,NULL);//触发score音乐
		mciSendString("play scoremusic",NULL,0,NULL);
	}
	
	if(abs(enemy_y[2]-main_car_y) <100 && abs(enemy_x[2]-main_car_x) <10)//撞中敌人
	{	
		enemy_x[2]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[2]=-100*(2+1);//减小敌人产生的重叠可能
		
		score=score+5;
		score_y=High*0.07;
		
		mciSendString("close scoremusic",NULL,0,NULL);
		mciSendString("open .\\score.mp3 alias scoremusic",NULL,0,NULL);//触发score音乐
		mciSendString("play scoremusic",NULL,0,NULL);
	}
	
	if(abs(enemy_y[3]-main_car_y) <100 && abs(enemy_x[3]-main_car_x) <10)//撞中敌人
	{	
		enemy_x[3]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[3]=-100*(3+1);//减小敌人产生的重叠可能
		
		score=score+5;
		score_y=High*0.07;
		
		mciSendString("close scoremusic",NULL,0,NULL);
		mciSendString("open .\\score.mp3 alias scoremusic",NULL,0,NULL);//触发score音乐
		mciSendString("play scoremusic",NULL,0,NULL);
	}
	
	if(abs(enemy_y[4]-main_car_y) <100 && abs(enemy_x[4]-main_car_x) <10)//撞中敌人
	{	
		enemy_x[4]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[4]=-100*(3+1);//减小敌人产生的重叠可能
		
		score=score+5;
		score_y=High*0.07;
		
		mciSendString("close scoremusic",NULL,0,NULL);
		mciSendString("open .\\score.mp3 alias scoremusic",NULL,0,NULL);//触发score音乐
		mciSendString("play scoremusic",NULL,0,NULL);
	}
	
	if(abs(enemy_y[5]-main_car_y) <100 && abs(enemy_x[5]-main_car_x) <10)//撞中敌人
	{	
		enemy_x[5]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[5]=-100*(3+1);//减小敌人产生的重叠可能
		
		score=score+5;
		score_y=High*0.07;
		
		mciSendString("close scoremusic",NULL,0,NULL);
		mciSendString("open .\\score.mp3 alias scoremusic",NULL,0,NULL);//触发score音乐
		mciSendString("play scoremusic",NULL,0,NULL);
	}
	
	if(abs(enemy_y[6]-main_car_y) <100 && abs(enemy_x[6]-main_car_x) <10)//撞中敌人
	{	
		enemy_x[6]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[6]=-100*(3+1);//减小敌人产生的重叠可能
		
		score=score+5;
		score_y=High*0.07;
		
		mciSendString("close scoremusic",NULL,0,NULL);
		mciSendString("open .\\score.mp3 alias scoremusic",NULL,0,NULL);//触发score音乐
		mciSendString("play scoremusic",NULL,0,NULL);
	}
	
	if(abs(enemy_y[7]-main_car_y) <100 && abs(enemy_x[7]-main_car_x) <10)//撞中敌人
	{	
		enemy_x[7]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[7]=-100*(3+1);//减小敌人产生的重叠可能
		
		score=score+5;
		score_y=High*0.07;
		
		mciSendString("close scoremusic",NULL,0,NULL);
		mciSendString("open .\\score.mp3 alias scoremusic",NULL,0,NULL);//触发score音乐
		mciSendString("play scoremusic",NULL,0,NULL);
	}
}

void boss_hit_judgement()
{
	if((main_car_y-boss_y[0]>0) && (main_car_y-boss_y[0]) <220 && abs(boss_x[0]-main_car_x) <10)//撞中boss
	{
		mciSendString("close gameover",NULL,0,NULL);
		mciSendString("open .\\gameover.mp3 alias gameover",NULL,0,NULL);//触发gameover音乐
		mciSendString("play gameover",NULL,0,NULL);
		
		boss_x[0]=170+107*(rand()%5);//boss1产生在五条路中的一条
		boss_y[0]=-300;
		
		heart_num--;//生命减少
		heart_y=High*0.07;
	}
	
	if((main_car_y-boss_y[1]>0) && (main_car_y-boss_y[1]) <220 && abs(boss_x[1]-main_car_x) <10)//撞中boss
	{
		mciSendString("close gameover",NULL,0,NULL);
		mciSendString("open .\\gameover.mp3 alias gameover",NULL,0,NULL);//触发gameover音乐
		mciSendString("play gameover",NULL,0,NULL);
		
		boss_x[1]=170+107*(rand()%5);//boss1产生在五条路中的一条
		boss_y[1]=-300;
		
		heart_num--;//生命减少
		heart_y=High*0.07;
	}
	
	if((main_car_y-boss_y[2]>0) && (main_car_y-boss_y[2]) <220 && abs(boss_x[2]-main_car_x) <10)//撞中boss
	{
		mciSendString("close gameover",NULL,0,NULL);
		mciSendString("open .\\gameover.mp3 alias gameover",NULL,0,NULL);//触发gameover音乐
		mciSendString("play gameover",NULL,0,NULL);
		
		boss_x[2]=170+107*(rand()%5);//boss1产生在五条路中的一条
		boss_y[2]=-300;
		
		heart_num--;//生命减少
		heart_y=High*0.07;
	}
	
	if(heart_num==0)
	{
		mciSendString("close gameMusic",NULL,0,NULL);
		mciSendString("open .\\fail.mp3 alias fail",NULL,0,NULL);//触发gameover音乐
		mciSendString("play fail",NULL,0,NULL);
		gameStatus=4;
	}	
}

void fuel_hit_judgement()
{
	if(abs(fuel_y-main_car_y) <40 && abs(fuel_x-main_car_x) <40)//撞中加油站
	{
		fuel_x=170+107*(rand()%5);//fuel产生在五条路中的一条
		fuel_y=-300;
		
		fuel=fuel+2;
		Fuel_y=High*0.07;
		
		mciSendString("close scoremusic",NULL,0,NULL);
		mciSendString("open .\\score.mp3 alias scoremusic",NULL,0,NULL);//触发score音乐
		mciSendString("play scoremusic",NULL,0,NULL);			
	}
	if(fuel<=0)
	{
		mciSendString("close gameMusic",NULL,0,NULL);
		mciSendString("open .\\fail.mp3 alias fail",NULL,0,NULL);//触发gameover音乐
		mciSendString("play fail",NULL,0,NULL);
		gameStatus=4;
	}
}

void avoid_stack()
{
	if(abs(enemy_y[0]-enemy_y[1]) <100 && abs(enemy_x[0]-enemy_x[1]) <10)
	{
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-500;
	}
	
	if(abs(enemy_y[0]-enemy_y[2]) <100 && abs(enemy_x[0]-enemy_x[2]) <10)
	{
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-500;
	}
	
	if(abs(enemy_y[0]-enemy_y[3]) <100 && abs(enemy_x[0]-enemy_x[3]) <10)
	{
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-500;
	}
	
	if(abs(enemy_y[0]-enemy_y[4]) <100 && abs(enemy_x[0]-enemy_x[4]) <10)
	{
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-500;
	}
	
	if(abs(enemy_y[0]-enemy_y[5]) <100 && abs(enemy_x[0]-enemy_x[5]) <10)
	{
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-500;
	}
	
	if(abs(enemy_y[0]-enemy_y[6]) <100 && abs(enemy_x[0]-enemy_x[6]) <10)
	{
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-500;
	}
	
	if(abs(enemy_y[0]-enemy_y[7]) <100 && abs(enemy_x[0]-enemy_x[7]) <10)
	{
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-500;
	}
	
	if(abs(enemy_y[1]-enemy_y[2]) <100 && abs(enemy_x[1]-enemy_x[2]) <10)
	{
		enemy_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[1]=-500;
	}
	
	if(abs(enemy_y[1]-enemy_y[3]) <100 && abs(enemy_x[1]-enemy_x[3]) <10)
	{
		enemy_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[1]=-500;
	}
	
	if(abs(enemy_y[1]-enemy_y[4]) <100 && abs(enemy_x[1]-enemy_x[4]) <10)
	{
		enemy_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[1]=-500;
	}
	
	if(abs(enemy_y[1]-enemy_y[5]) <100 && abs(enemy_x[1]-enemy_x[5]) <10)
	{
		enemy_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[1]=-500;
	}
	
	if(abs(enemy_y[1]-enemy_y[6]) <100 && abs(enemy_x[1]-enemy_x[6]) <10)
	{
		enemy_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[1]=-500;
	}
	
	if(abs(enemy_y[1]-enemy_y[7]) <100 && abs(enemy_x[1]-enemy_x[7]) <10)
	{
		enemy_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[1]=-500;
	}
	
	if(abs(enemy_y[2]-enemy_y[3]) <100 && abs(enemy_x[2]-enemy_x[3]) <10)
	{
		enemy_x[2]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[2]=-500;
	}
	
	if(abs(enemy_y[2]-enemy_y[4]) <100 && abs(enemy_x[2]-enemy_x[4]) <10)
	{
		enemy_x[2]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[2]=-500;
	}
	
	if(abs(enemy_y[2]-enemy_y[5]) <100 && abs(enemy_x[2]-enemy_x[5]) <10)
	{
		enemy_x[2]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[2]=-500;
	}
	
	if(abs(enemy_y[2]-enemy_y[6]) <100 && abs(enemy_x[2]-enemy_x[6]) <10)
	{
		enemy_x[2]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[2]=-500;
	}
	
	if(abs(enemy_y[2]-enemy_y[7]) <100 && abs(enemy_x[2]-enemy_x[7]) <10)
	{
		enemy_x[2]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[2]=-500;
	}
	
	if(abs(enemy_y[3]-enemy_y[4]) <100 && abs(enemy_x[3]-enemy_x[4]) <10)
	{
		enemy_x[3]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[3]=-500;
	}
	
	if(abs(enemy_y[3]-enemy_y[5]) <100 && abs(enemy_x[3]-enemy_x[5]) <10)
	{
		enemy_x[3]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[3]=-500;
	}
	
	if(abs(enemy_y[3]-enemy_y[6]) <100 && abs(enemy_x[3]-enemy_x[6]) <10)
	{
		enemy_x[3]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[3]=-500;
	}
	
	if(abs(enemy_y[3]-enemy_y[7]) <100 && abs(enemy_x[3]-enemy_x[7]) <10)
	{
		enemy_x[3]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[3]=-500;
	}
	
	if(abs(enemy_y[4]-enemy_y[5]) <100 && abs(enemy_x[4]-enemy_x[5]) <10)
	{
		enemy_x[4]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[4]=-500;
	}
	
	if(abs(enemy_y[4]-enemy_y[6]) <100 && abs(enemy_x[4]-enemy_x[6]) <10)
	{
		enemy_x[4]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[4]=-500;
	}
	
	if(abs(enemy_y[4]-enemy_y[7]) <100 && abs(enemy_x[4]-enemy_x[7]) <10)
	{
		enemy_x[4]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[4]=-500;
	}
	
	if(abs(enemy_y[5]-enemy_y[6]) <100 && abs(enemy_x[5]-enemy_x[6]) <10)
	{
		enemy_x[5]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[5]=-500;
	}
	
	if(abs(enemy_y[5]-enemy_y[7]) <100 && abs(enemy_x[5]-enemy_x[7]) <10)
	{
		enemy_x[5]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[5]=-500;
	}
	
	if(abs(enemy_y[6]-enemy_y[7]) <100 && abs(enemy_x[6]-enemy_x[7]) <10)
	{
		enemy_x[6]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[6]=-500;
	}
	
	if(abs(boss_y[0]-enemy_y[0]) <220 && abs(boss_x[0]-enemy_x[0]) <10)
	{
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-500;
	}
	
	if(abs(boss_y[0]-enemy_y[1]) <220 && abs(boss_x[0]-enemy_x[1]) <10)
	{
		enemy_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[1]=-500;
	}
	
	if(abs(boss_y[0]-enemy_y[2]) <220 && abs(boss_x[0]-enemy_x[2]) <10)
	{
		enemy_x[2]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[2]=-500;
	}
	
	if(abs(boss_y[0]-enemy_y[3]) <220 && abs(boss_x[0]-enemy_x[3]) <10)
	{
		enemy_x[3]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[3]=-500;
	}
	
	if(abs(boss_y[0]-enemy_y[4]) <220 && abs(boss_x[0]-enemy_x[4]) <10)
	{
		enemy_x[4]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[4]=-500;
	}
	
	if(abs(boss_y[0]-enemy_y[5]) <220 && abs(boss_x[0]-enemy_x[5]) <10)
	{
		enemy_x[5]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[5]=-500;
	}
	
	if(abs(boss_y[0]-enemy_y[6]) <220 && abs(boss_x[0]-enemy_x[6]) <10)
	{
		enemy_x[6]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[6]=-500;
	}
	
	if(abs(boss_y[0]-enemy_y[7]) <220 && abs(boss_x[0]-enemy_x[7]) <10)
	{
		enemy_x[7]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[7]=-500;
	}
	
	if(abs(boss_y[1]-enemy_y[0]) <220 && abs(boss_x[1]-enemy_x[0]) <10)
	{
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-500;
	}
	
	if(abs(boss_y[1]-enemy_y[1]) <220 && abs(boss_x[1]-enemy_x[1]) <10)
	{
		enemy_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[1]=-500;
	}
	
	if(abs(boss_y[1]-enemy_y[2]) <220 && abs(boss_x[1]-enemy_x[2]) <10)
	{
		enemy_x[2]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[2]=-500;
	}
	
	if(abs(boss_y[1]-enemy_y[3]) <220 && abs(boss_x[0]-enemy_x[3]) <10)
	{
		enemy_x[3]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[3]=-500;
	}
	
	if(abs(boss_y[1]-enemy_y[4]) <220 && abs(boss_x[1]-enemy_x[4]) <10)
	{
		enemy_x[4]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[4]=-500;
	}
	
	if(abs(boss_y[1]-enemy_y[5]) <220 && abs(boss_x[1]-enemy_x[5]) <10)
	{
		enemy_x[5]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[5]=-500;
	}
	
	if(abs(boss_y[1]-enemy_y[6]) <220 && abs(boss_x[1]-enemy_x[6]) <10)
	{
		enemy_x[6]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[6]=-500;
	}
	
	if(abs(boss_y[1]-enemy_y[7]) <220 && abs(boss_x[0]-enemy_x[7]) <10)
	{
		enemy_x[7]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[7]=-500;
	}
	
	if(abs(boss_y[2]-enemy_y[0]) <220 && abs(boss_x[2]-enemy_x[0]) <10)
	{
		enemy_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[0]=-500;
	}
	
	if(abs(boss_y[2]-enemy_y[1]) <220 && abs(boss_x[2]-enemy_x[1]) <10)
	{
		enemy_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[1]=-500;
	}
	
	if(abs(boss_y[2]-enemy_y[2]) <220 && abs(boss_x[2]-enemy_x[2]) <10)
	{
		enemy_x[2]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[2]=-500;
	}
	
	if(abs(boss_y[2]-enemy_y[3]) <220 && abs(boss_x[2]-enemy_x[3]) <10)
	{
		enemy_x[3]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[3]=-500;
	}
	
	if(abs(boss_y[2]-enemy_y[4]) <220 && abs(boss_x[2]-enemy_x[4]) <10)
	{
		enemy_x[4]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[4]=-500;
	}
	
	if(abs(boss_y[2]-enemy_y[5]) <220 && abs(boss_x[2]-enemy_x[5]) <10)
	{
		enemy_x[5]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[5]=-500;
	}
	
	if(abs(boss_y[2]-enemy_y[6]) <220 && abs(boss_x[2]-enemy_x[6]) <10)
	{
		enemy_x[6]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[6]=-500;
	}
	
	if(abs(boss_y[2]-enemy_y[7]) <220 && abs(boss_x[2]-enemy_x[7]) <10)
	{
		enemy_x[7]=170+107*(rand()%5);//敌人产生在五条路中的一条
		enemy_y[7]=-500;
	}
	
	if(abs(boss_y[0]-boss_y[1]) <300 && abs(boss_x[0]-boss_x[1]) <10)
	{
		boss_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		boss_y[0]=-500;
	}
	
	if(abs(boss_y[0]-boss_y[2]) <300 && abs(boss_x[0]-boss_x[2]) <10)
	{
		boss_x[0]=170+107*(rand()%5);//敌人产生在五条路中的一条
		boss_y[0]=-500;
	}
	
	if(abs(boss_y[1]-boss_y[2]) <300 && abs(boss_x[1]-boss_x[2]) <10)
	{
		boss_x[1]=170+107*(rand()%5);//敌人产生在五条路中的一条
		boss_y[1]=-500;
	}
	
}

void move()
{
	if (f=='A')
	{
		if (Temp_x>main_car_x)
			Temp_x=Temp_x-0.5;
	}
	if (f=='D')
	{
		if (Temp_x<main_car_x)
			Temp_x=Temp_x+0.5;
	}
	if (f=='W')
	{
		if (Temp_y>main_car_y)
			Temp_y=Temp_y-0.3;
	}
	if (f=='S')
	{
		if (Temp_y<main_car_y)
			Temp_y=Temp_y+0.3;
	}
	
	if(score_y>-60)
		score_y=score_y-0.07;
	if(Fuel_y>-60)
		Fuel_y=Fuel_y-0.07;
	if(heart_y>-60)
		heart_y=heart_y-0.07;
}

void updateWithoutInput()
{
	background_fall();
	
	fuel_fall();            
	
	enemy_fall();
	
	boss_fall();
	
	enemy_hit_judgement();
	
	boss_hit_judgement();
	
	fuel_hit_judgement();
	
	avoid_stack();
	
	move();
}

void updateWithInput()
{
	char input;
	if(kbhit())
	{
		input=getch();
		if(input=='a' && main_car_x>180)//向左
		{
			f='A';
			main_car_x = main_car_x-107;
		}
		if(input=='d' && main_car_x<545)//向右
		{
			f='D';
			main_car_x = main_car_x+107;
		}
		if(input=='w' && main_car_y>=50)//向前
		{
			f='W';
			main_car_y=main_car_y-70;
		}
		if(input=='s' && main_car_y<=High-200)//向后
		{
			f='S';
			main_car_y=main_car_y+70;
		}
		
		if (input == 27) // ESC键的ACSII码为27
		{
			gameStatus = 3;
		}
	}
}

void gameover()
{
	mciSendString("close gameMusic",NULL,0,NULL);
	EndBatchDraw();
	closegraph();
}

int main()
{
	startup();  // 数据初始化	
	while (1)  //  游戏循环执行
	{
		show();  // 显示新画面
		updateWithInput();     // 与用户输入有关的更新
		updateWithoutInput();  // 与用户输入无关的更新
		fuel=fuel-0.002;//利用刷新的次数计时
	}
	gameover();     // 游戏结束、后续处理
	return 0;
}